因为它使用了一种变通方法，即使在使用别名模板时，enable\_if语法也相当笨拙:为了获得所需的效果，添加了一个的模板参数，并“滥用”该参数来提供函数模板可用的特定要求。这样的代码很难读懂，也使函数模板的其他部分难以理解。

原则上，只需要一种语言特性，允许制定函数的需求或约束，如果需求/约束没有得到满足，函数就会忽略。

这是期待已久的语言特性概念的应用，其允许用自己简单的语法制定模板的需求/条件。但尽管经过长时间的讨论，概念仍然没有成为C++17标准的一部分。然而，一些编译器提供了对这种特性的实验性支持，而且概念可能会成为C++17后的下一个标准的一部分。

对于概念，正如其作用，只需写下以下内容:

\begin{lstlisting}[style=styleCXX]
template<typename STR>
requires std::is_convertible_v<STR,std::string>
Person(STR&& n) : name(std::forward<STR>(n)) {
	...
}
\end{lstlisting}

甚至可以将需求指定为一般概念

\begin{lstlisting}[style=styleCXX]
template<typename T>
concept ConvertibleToString = std::is_convertible_v<T,std::string>;
\end{lstlisting}

把这个概念表述为一种需求

\begin{lstlisting}[style=styleCXX]
template<typename STR>
requires ConvertibleToString<STR>
Person(STR&& n) : name(std::forward<STR>(n)) {
	...
}
\end{lstlisting}

也可以这样表述:

\begin{lstlisting}[style=styleCXX]
template<ConvertibleToString STR>
Person(STR&& n) : name(std::forward<STR>(n)) {
	...
}
\end{lstlisting}

关于C++概念的详细讨论，请参阅附录E。




















